home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung 2 / Power-Programmierung CD 2 (Tewi)(1994).iso / c / library / dos / diverses / leda / incl / rb_tree.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  7.2 KB  |  275 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  rb_tree.h
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16.  
  17. #ifndef RBTREEH
  18. #define RBTREEH
  19.  
  20. //------------------------------------------------------------------------------
  21. //
  22. // rb_tree:  red black trees (leaf oriented)
  23. //
  24. // Walter Zimmer      (1989)
  25. //
  26. // Implementation as described in
  27. // Kurt Mehlhorn : "Data Structures and Algorithms 1", section III.5.2
  28. //
  29. // Modifications:
  30. // - Virtual compare function                         (S. Naeher, Aug. 1989)
  31. // - Delete: overwrite copies of keys in inner nodes  (S. Naeher, Okt. 1989)
  32. // 
  33. //------------------------------------------------------------------------------
  34.  
  35. #include <LEDA/basic.h>
  36. #include <LEDA/b_stack.h>
  37.  
  38.  
  39. // falls TEST def. ist => tracen der aufgerufenen fkt.
  40. // falls TEST1 def. ist => test auf schwarztiefe und print moegl. 
  41.  
  42. #define NOTEST
  43. #define TEST1
  44.  
  45. #ifdef TEST
  46. #define TRACE(x)  cout << form x
  47. #define TRACE2(x,ebene)  if ( debug >= (ebene) ) cout << form  x
  48. #define TRACE_FUNC(x) x
  49. // extern int debug ;  muss im testprogramm definiert werden falls
  50. // TRACE2(x,ebene) benutzt wird
  51. #else 
  52. #define TRACE(x) 
  53. #define TRACE2(x,ebene) 
  54. #define TRACE_FUNC(x) 
  55. #endif
  56.  
  57.  
  58. //--------------------------------------------------------------------
  59. // some declarations and type definitions
  60. //--------------------------------------------------------------------
  61.  
  62. class rb_tree;
  63. class rb_tree_node;
  64.  
  65. typedef rb_tree_node* rb_tree_node_ptr;
  66.  
  67. typedef rb_tree_node* rb_tree_item;
  68.  
  69. typedef rb_tree_node* (*get_node_fct)(ent);
  70.  
  71.  
  72. typedef void (*DRAW_RB_NODE_FCT)(double,double,void*);
  73. typedef void (*DRAW_RB_EDGE_FCT)(double,double,double,double);
  74.  
  75. struct stack_el {
  76.   rb_tree_node* nodeptr;
  77.  
  78.   int dir;   /* 0: left
  79.                 1: right
  80.                 2: undefined
  81.              */
  82.  
  83.   stack_el (rb_tree_node* p,int d)
  84.      { nodeptr = p; dir = d ; }
  85.   stack_el ()
  86.      { nodeptr = 0; dir = 2; }
  87. };
  88.  
  89. typedef stack_el* stack_el_ptr;
  90. declare(b_stack,stack_el);
  91. typedef b_stack(stack_el)  rb_tree_stack;
  92.  
  93. // ----------------------------------------------------------------
  94. // class rb_tree_node 
  95. // ----------------------------------------------------------------
  96.  
  97. class rb_tree_node
  98. {  ent e;                  // entry
  99.    ent k;                  // searchkey
  100.  
  101.    int c;                  // color
  102.                            // for leaves red =2 , black = 3
  103.                            // for nodes  red =0 , black = 1
  104.                            // 4: unknown
  105.  
  106.    rb_tree_node* son[2];   // left and right son
  107.  
  108.    friend class rb_tree;
  109.  
  110.    public :
  111.  
  112.    ent entry()   { return e; }
  113.    ent key()     { return k; }
  114.    int col()  { return c; }
  115.  
  116.    // fuer blatter ist red =2 , black = 3
  117.    // fuer knoten  ist red =0 , black = 1
  118.  
  119.    int is_node()   { return  col() <  2; } 
  120.    int is_leaf()   { return  col() <  2; }
  121.    int is_black()  { return  col() &  1; }   
  122.    int is_red()    { return  !is_black();}   
  123.  
  124.    void gets_red_node()   { c = 0; }
  125.    void gets_black_node() { c = 1; }
  126.    void gets_red_leaf()   { c = 2; }
  127.    void gets_black_leaf() { c = 3; }
  128.  
  129.    rb_tree_node(ent K = 0 , ent E = 0 ,  int color = 4  ,                            rb_tree_node* leftson = 0 , rb_tree_node* rightson = 0)
  130.    {  
  131.       k = K ;
  132.       e = E ; 
  133.       c = color ;
  134.       son[0] = leftson ;
  135.       son[1] = rightson;
  136.    }         
  137.  
  138.    rb_tree_node(rb_tree_node_ptr p)
  139.    {
  140.       k = p->key();
  141.       e = p->entry() ;
  142.       c = p->col();
  143.       son[0] = 0;
  144.       son[1] = 0;
  145.    }         
  146.  
  147.    OPERATOR_NEW(5)
  148.    OPERATOR_DEL(5)
  149.  
  150. };
  151.  
  152.  
  153. // ----------------------------------------------------------------
  154. // class rb_tree
  155. // ----------------------------------------------------------------
  156.  
  157. class rb_tree
  158.   rb_tree_node* root;
  159.   rb_tree_node* list_ptr;   // zeigt auf des minimum im baum
  160.   int counter;             // auf Vax genuegt int , sonst vielleicht long noetig
  161.   rb_tree_stack st;
  162.  
  163.  
  164.   rb_tree_node* get_node1(ent)   const;
  165.   rb_tree_node* get_node(ent x)  const{ return get_node1(x) ; } 
  166.   rb_tree_node* search(ent);
  167.  
  168.   rb_tree_node* copy_tree(rb_tree_node*,rb_tree_node_ptr&) const;
  169.  
  170.   void del_tree(rb_tree_node*);
  171.  
  172.   void pop(rb_tree_node_ptr& q,int& dir);
  173.  
  174.   void push(rb_tree_node_ptr q,int dir1)
  175.     { stack_el z(q,dir1) ; st.push(z) ; }
  176.  
  177.   void rotation(rb_tree_node*,rb_tree_node*,int);
  178.   void double_rotation(rb_tree_node*,rb_tree_node*,rb_tree_node*,int,int);
  179.   void if_root(rb_tree_node*,rb_tree_node*);
  180.  
  181.  
  182.   virtual int cmp(ent& x,ent& y) const { return int(x)-int(y); }
  183.  
  184.   virtual void clear_key(ent& x) const { Clear(x); }
  185.   virtual void clear_inf(ent& x) const { Clear(x); }
  186.  
  187.   virtual void copy_key(ent& x)  const { Copy(x);  }
  188.   virtual void copy_inf(ent& x)  const { Copy(x);  }
  189.  
  190.   public:
  191.  
  192.   rb_tree_node* first_item()             const  { return list_ptr; }
  193.   rb_tree_node* next_item(rb_tree_node*) const;
  194.  
  195.   rb_tree_node* next_smaller(ent) const;
  196.   rb_tree_node* next_bigger(ent)  const;
  197.  
  198.   rb_tree_node* succ(rb_tree_node* p) const
  199.   {return ( !p  ||  p->son[1] == list_ptr ) ? 0 : p->son[1]; }
  200.  
  201.   rb_tree_node* pred(rb_tree_node* p) const
  202.   { return ( !p  ||  p == list_ptr   )  ?  0 : p->son[0] ; }
  203.  
  204.   rb_tree_node* cyclic_succ(rb_tree_node* p) const
  205.   { return p ? p->son[1] : 0; }
  206.  
  207.   rb_tree_node* cyclic_pred(rb_tree_node* p) const
  208.   { return p ? p->son[0] : 0; }
  209.  
  210.   rb_tree_node* min() const { return list_ptr; }
  211.   rb_tree_node* find_min() const { return list_ptr; }
  212.   rb_tree_node* max() const { return ( list_ptr ? list_ptr->son[0] : 0  ) ; }
  213.  
  214.   void del_min()                { if (root)  del(min()->k); }
  215.   void del_item(rb_tree_node* p){ if (p)     del(p->k); }
  216.   void del_max()                { if (root)  del(max()->k); }
  217.  
  218.   void decrease_key(rb_tree_node* p, ent k) { ent i = p->e; 
  219.                                               copy_inf(i);
  220.                                               del(p->k); 
  221.                                               insert(k,i);
  222.                                               clear_inf(i);
  223.                                              }
  224.  
  225.   void del(ent);
  226.  
  227.   rb_tree_node* insert(ent,ent);
  228.   rb_tree_node* lookup(ent) const;
  229.   int  member(ent)          const;
  230.  
  231.   ent& access(ent);
  232.   void change_inf(rb_tree_node*,ent);
  233.  
  234.   ent   key(rb_tree_node* p)  const { return  p->key() ;  }
  235.   ent&  info(rb_tree_node* p) const { return  p->e ;      }
  236.   ent   inf(rb_tree_node* p)  const { return  p->e ;      }
  237.  
  238.   int size()   const { return counter; } 
  239.   int empty()  const { return root ? false : true ; }
  240.   void clear();
  241.  
  242.  
  243.   rb_tree()  : st(32)
  244.   {  root  = list_ptr = 0 ;
  245.      counter = 0; 
  246.   }
  247.  
  248.   rb_tree(const rb_tree&);
  249.   rb_tree& operator=(const rb_tree&);
  250.  
  251.   ~rb_tree() { clear(); }
  252.  
  253.  
  254.   void draw(DRAW_RB_NODE_FCT, DRAW_RB_NODE_FCT, DRAW_RB_EDGE_FCT, rb_tree_node*,
  255.           double, double, double, double, double);
  256.  
  257.   void draw(DRAW_RB_NODE_FCT, DRAW_RB_NODE_FCT, DRAW_RB_EDGE_FCT, 
  258.           double, double, double, double);
  259.  
  260. #ifdef TEST1
  261.  
  262.   int black_deep_test() const;
  263.   int deep_test(rb_tree_node*) const;
  264.  
  265.   void print() const;
  266.   void print_tree(rb_tree_node*,int) const;
  267.  
  268. #endif
  269.  
  270. };
  271.  
  272. #endif  #RBTREEH
  273.